#include <stdio.h>
#include <unistd.h>
#include <signal.h>

volatile int flag = 0;

void change(int signo)
{
    flag = 1;
    printf("change flag 0->1, pid: %d\n", getpid());
}

int main()
{
    signal(2, change);
    while (!flag);
    printf("我是正常退出的! pid: %d\n", getpid());
}





// #include <iostream>
// #include <unistd.h>
// #include <signal.h>

//using namespace std;

// void PrintBlock()
// {
//     sigset_t set, oset;
//     //清空
//     sigemptyset(&set);
//     sigemptyset(&oset);

//     //设置到内核
//     sigprocmask(SIG_BLOCK, &set, &oset);
//     cout << "block: ";
//     for (int signo = 31; signo > 0; --signo)
//     {
//         //判断是否在其中
//         if (sigismember(&oset, signo))
//         {
//             cout << 1;
//         }
//         else 
//         {
//             cout << 0;
//         }
//     }
//     cout << endl;
// }

// void PrintPending()
// {
//     sigset_t pending;
//     sigpending(&pending);

//     cout << "pending: ";
//     for (int signo = 31; signo > 0; --signo)
//     {
//         //判断是否在其中
//         if (sigismember(&pending, signo))
//         {
//             cout << 1;
//         }
//         else 
//         {
//             cout << 0;
//         }
//     }
//     cout << endl;
// }

// void handler(int signo)
// {
//     static int cnt = 0;
//     ++cnt;
//     while (true)
//     {
//         std::cout << "get a sig: " << signo << ", cnt:" << cnt << std::endl;
//         PrintPending();
//         sleep(1);
//         //break;
//     }
//     //exit(1);
// }

// int main()
// {
//     struct sigaction act, oact;
//     act.sa_handler = handler;
//     sigemptyset(&act.sa_mask);
//     //添加屏蔽信号
//     sigaddset(&act.sa_mask, 3);
//     sigaddset(&act.sa_mask, 4);
//     sigaddset(&act.sa_mask, 5);
//     sigaddset(&act.sa_mask, 6);

//     ::sigaction(2, &act, &oact);

//     while (true)
//     {
//         //PrintBlock();
//         PrintPending();
//         pause();
//     }
//     return 0;
// }
